	SETUPLEN = 4
	BOOTSEC  = 0x7c0
	INITSEG  = 0x9000
	SETUPSEG = 0x9020
	SYSSEG   = 0x1000

	//        SYSSIZE 由 build.c 计算提供
	//        ENDSEG   = SYSSEG + SYSSIZE
	//        我们这里直接写死, SYSSIZE = 0x1000
	SYSSIZE = 0x1000
	ENDSEG  = SYSSEG + SYSSIZE

	//        fixme: ROOT_DEV = 0 是什么意思?
	ROOT_DEV = 0x000

	.code16
	.text

	.global _start

_start:
	jmpl $BOOTSEC, $_start2

_start2:
	//    先将 boot 段搬到 0x90000 处.
	movw $BOOTSEC, %ax
	movw %ax, %ds
	movw $INITSEG, %ax
	movw %ax, %es
	movw $256, %cx
	subw %si, %si
	subw %di, %di
	rep  movsw

	//    cs = 0x9000
	jmpl $INITSEG, $go

go:
	//    ds, es, ss 都设置为 0x9000
	movw %cs, %ax
	movw %ax, %ds
	movw %ax, %es
	movw %ax, %ss

	//    用不到, 只是顺便将 sp 指向一个合理的位置.
	movw $0xFF00, %sp

load_setup:
	//    加载 setup 到 0x90200
	//    ah = 0x02, 功能号读取磁盘到内存
	//    al = 4, 读取 4 个扇区
	//    es:bx = 0x9000:200, 要写入的内存地址
	//    cx = 2, 起始扇区号
	//    dx = 0, 0 表示软盘, 7 表示硬盘
	//    当成功时 c 位置为 0, 否则为 1
	//    失败后使用 0x13 号中断重置(ah=0)软盘(dx=0)
	movb $0x02, %ah
	movb $SETUPLEN, %al
	movw $0x0200, %bx
	movw $0x0002, %cx
	movw $0x0000, %dx
	int  $0x13
	jnc  ok_load_setup
	movw $0x0000, %ax
	movw $0x0000, %dx
	int  $0x13

ok_load_setup:
	//    打印信息到屏幕
	//    bios 0x10 中断, ES:BP 字符串地址
	//    ah=0x13 功能号表示使用 teletype 模式输出字符串
	//    al=0x01 表示字符串只包含字符码, 属性由 bl 提供
	//    bh=0 表示页号, 0 是第一页
	//    bl=0xc, 属性 00001100, 背景色非闪烁, 黑色, 前景色闪烁, 红色
	//    dh, dl 显示坐标(0, 0)
	movw $msg, %ax
	movw %ax, %bp
	movw $0x1301, %ax
	movw $0xc, %bx
	movw $21, %cx
	movw $0, %dx
	int  $0x10

	jmpl $SETUPSEG, $0

msg:
	.ascii "Setup has been loaded"

	.org 508

root_dev:
	.word ROOT_DEV

boot_flag:
	.word 0xaa55
